package mycos

import (
	"context"
	"data/config"
	"fmt"
	"io"
	"net/http"
	"os"
	"public/mylog"

	cos "github.com/mozillazg/go-cos"
)

var c *cos.Client
var c_ex *cos.Client
var url string

func init() {
	config := config.GetCosInfo()
	url = "https://" + config.Bucket + "-" + config.AppID + ".cos." + config.Region + ".myqcloud.com" //https://<bucket>-<appid>.cos.<region>.myqcloud.com
	b, _ := cos.NewBaseURL(url)                                                                       //https://mytest-1252338888.cos.ap-chengdu.myqcloud.com
	c = cos.NewClient(b, &http.Client{
		Transport: &cos.AuthorizationTransport{
			SecretID:  config.SecretID,
			SecretKey: config.Secretkey,
		},
	})

	c_ex = cos.NewClient(b, &http.Client{
		Transport: &cos.AuthorizationTransport{
			SecretID:  config.SecretID,
			SecretKey: config.Secretkey,
		},
	})
}

//获取上传地址路径
func GetUploadHeaderUrl() string {
	return url
}

//简单上传 对象大小限制在 5GB 以内
//file_dir：本地文件路径
//name: cos Object名称
func UploadFile(file_dir, name string) string {
	file, err := os.Open(file_dir)
	if err != nil {
		// panic(err)
		mylog.Error(err)
		return ""
	}
	finfo, err := file.Stat()
	if err != nil {
		mylog.Error(err)
		return ""
	}
	options := cos.ObjectPutHeaderOptions{ContentLength: int(finfo.Size())}
	opt := cos.ObjectPutOptions{ObjectPutHeaderOptions: &options}
	_, err = c.Object.Put(context.Background(), name, file, &opt) //上传文件
	defer file.Close()

	if err != nil {
		mylog.Error(err)
		return ""
	}
	return url + "/" + name
}

//分块上传
// Upload Part请求实现在初始化以后的分块上传，支持的块的数量为1到10000，块的大小为1 MB 到5 GB。
// 在每次请求Upload Part时候，需要携带partNumber和uploadID，partNumber为块的编号，支持乱序上传。
//
// 当传入uploadID和partNumber都相同的时候，后传入的块将覆盖之前传入的块。当uploadID不存在时会返回404错误，NoSuchUpload.
//
// 当 r 不是 bytes.Buffer/bytes.Reader/strings.Reader 时，必须指定 opt.ContentLength
func UploadPart(name string, uploadID string, r io.Reader, partNumber int) string {

	resp, err := c.Object.UploadPart(
		context.Background(), name, uploadID, partNumber, r, nil,
	)
	if err != nil {
		mylog.Error(err)
		return ""
	}
	fmt.Printf("%s\n", resp.Status)
	return resp.Header.Get("Etag") //上传文件内容的 MD5 值。
}

//初始化分块上传
//name:Object名称
//https://cloud.tencent.com/document/product/436/6254
func InitUpload(name string) *cos.InitiateMultipartUploadResult {
	v, _, err := c.Object.InitiateMultipartUpload(context.Background(), name, nil)
	if err != nil {
		mylog.Error(err)
		return nil
	}
	fmt.Printf("%#v\n", v)
	return v
}

//列出已上传的分块
func ListParts(name, uploadID string) []cos.Object {
	v, _, err := c.Object.ListParts(context.Background(), name, uploadID)
	if err != nil {
		mylog.Error(err)
		return nil
	}
	fmt.Printf("%s\n", v.Initiator.ID)
	fmt.Printf("%s\n", v.Owner.ID)

	for _, p := range v.Parts {
		fmt.Printf("%d, %s, %d\n", p.PartNumber, p.ETag, p.Size)
	}
	return v.Parts
}

//简单上传 对象大小限制在 5GB 以内
//file_dir：本地文件路径
//name: cos Object名称
func UploadFileEx(file_dir, name string) string {
	file, err := os.Open(file_dir)
	if err != nil {
		// panic(err)
		mylog.Error(err)
		return ""
	}
	finfo, err := file.Stat()
	if err != nil {
		mylog.Error(err)
		return ""
	}
	options := cos.ObjectPutHeaderOptions{ContentLength: int(finfo.Size())}
	opt := cos.ObjectPutOptions{ObjectPutHeaderOptions: &options}
	_, err = c_ex.Object.Put(context.Background(), name, file, &opt) //上传文件
	defer file.Close()

	if err != nil {
		mylog.Error(err)
		return ""
	}
	return url + "/" + name
}
